# 函数的创建，在函数创建时可以指定入参的默认值，如果调用时为传递该参数，会采取默认值
def FunName(name,age=18):
    print("入参为：",name,age);
    return"";

# 调用方式1 通过位置传参
FunName("老黑",5);

# 调用方式2 通过关键字传参
FunName(age = 5,name = "老黑");

# 调用方式3 位置传参2 将列表按位置转化传入函数中时，需要在列表前加入*（一颗）, 注意: 当列表内的元素个数不等于函数形参个数时会抛出异常
arr = ['颤三',88];
FunName(*arr);

# 调用方式4 关键字传参2 ,将集合按key转化传入函数中时，需要在集合前加入**（两颗）, 注意: key必须等同于函数形参，否则会抛出异常
json = {"name":"刘老四","age":45};
FunName(**json);

# 元组不可转化
ran = ("溜达神",99999);
# FunName(*ran); or FunName(**ran);

# 创建可变参数方法
# 常见方法是填写的形参可以随意搭配，a,b,*,c,d,*arg,**args..都是符合规则的
# 1.可变参数，按位传参，没有具体参数个数
def Fun1(*params):
    return params;

print(Fun1(10,20,30,50,81)); #(10, 20, 30, 50, 81)

# 2.可变参数，关键字传参，没有具体参数个数
def Fun2(**params):
    return params;

print(Fun2(a=11,b=21,c=31)); #{'a': 11, 'b': 21, 'c': 31}

# 3.指定传递参数必须使用关键字传参，在需要的位置处加一颗 * 这样， * 号后面的参数必须使用关键字传递参数，否则抛出异常
def Fun3(a,b,*,c,d):
    return a,b,c,d;

print(Fun3(a=11,b=21,c=31,d=66)); #(11, 21, 31, 66)





